package com.zwh.se.design_pattern.creational.singleton;

/**
 * 懒汉式（线程安全版本——失败案例）
 *
 * @author yexi
 */
public class LazySafetyV2 {
    //保持该类在系统中有且只有一个实例
    private static LazySafetyV2 INSTANCE;

    //私有化构造方法
    private LazySafetyV2() {
    }

    //对外界提供统一调用方法获取单例对象
    public static LazySafetyV2 getInstance() {
        //因为这个判断和下面的创建没有一体化操作，相当于没有加锁。
        if (INSTANCE == null) {
            //妄图通过减小同步代码块的方式提高效率，然后不可行，可以发现还是会导致线程不安全的情况。
            synchronized (LazySafetyV2.class) {
                try {
                    //模拟在创建对象的过程中稍微出了点问题或者说业务需要,导致慢了一点点。
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //只在调用了方法时才进行初始化(方法调用时才实例化，所以解决了饿汉式的缺点）
                INSTANCE = new LazySafetyV2();
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() ->
                    System.out.println(LazySafetyV2.getInstance().hashCode())
            ).start();
        }
    }

}
